{"thread":{"id":"44508","subject":"Staging chunks can get confused","startedAt":"2016-11-18T11:29:41Z","lastAt":"2016-11-18T11:29:41Z","messageCount":1,"participants":["Daurnimator"],"isPatch":false,"patchVersion":null,"patchTotal":null},"messages":[{"id":"306140","messageId":"CAEnbY+cEts2HrDLGd-5S9JC6PUrON_TpiyGy_=DAEbOT5z=MJw@mail.gmail.com","threadId":"44508","inReplyTo":null,"subject":"Staging chunks can get confused","fromName":"Daurnimator","fromEmail":"quae@daurnimator.com","sentAt":"2016-11-18T11:29:32Z","receivedAt":"2016-11-18T11:29:41Z","isPatch":false,"sender":{"key":"quae@daurnimator.com","avatar":null},"body":"Tonight I was staging changes with `git add -p` and noticed they got\napplied at the *wrong* location.\nMy guess is that when you stage a hunk it doesn't do a line number\nfix-up for earlier unstaged hunks in the file.\n\nScreencast: https://asciinema.org/a/7y9qhr0837a7t96m8w14mupnk\nAlternatively, an example follows:\n\n$ git add -p\ndiff --git a/unistring/unistring.c b/unistring/unistring.c\nindex 62bbc8a..45ced5d 100644\n--- a/unistring/unistring.c\n+++ b/unistring/unistring.c\n@@ -17,6 +17,27 @@ static const char *const uninormnames[] = {\"NFD\",\n\"NFC\", \"NFKD\", \"NFKC\", NULL};\n #define lunistring_optuninorm(L, arg)\n(lua_isnoneornil(L,(arg))?NULL:lunistring_checkuninorm((L), (arg)))\n\n\n+const uint8_t * u8_check (const uint8_t *s, size_t n);\n+int u8_mblen (const uint8_t *s, size_t n);\n+int u8_mbtouc_unsafe (ucs4_t *puc, const uint8_t *s, size_t n);\n+int u8_mbtouc (ucs4_t *puc, const uint8_t *s, size_t n);\n+int u8_mbtoucr (ucs4_t *puc, const uint8_t *s, size_t n);\n+int u8_uctomb (uint8_t *s, ucs4_t uc, int n);\n+size_t u8_mbsnlen (const uint8_t *s, size_t n);\n+\n+int u8_strmblen (const uint8_t *s);\n+int u8_strmbtouc (ucs4_t *puc, const uint8_t *s);\n+const uint8_t * u8_next (ucs4_t *puc, const uint8_t *s);\n+const uint8_t * u8_prev (ucs4_t *puc, const uint8_t *s, const uint8_t *start);\n+\n+uint8_t * u8_conv_from_encoding (const char *fromcode, enum\niconv_ilseq_handler handler, const char *src, size_t srclen, size_t\n*offsets, uint8_t *resultbuf, size_t *lengthp);\n+char * u8_conv_to_encoding (const char *tocode, enum\niconv_ilseq_handler handler, const uint8_t *src, size_t srclen, size_t\n*offsets, char *resultbuf, size_t *lengthp);\n+uint8_t * u8_strconv_from_encoding (const char *string, const char\n*fromcode, enum iconv_ilseq_handler handler);\n+char * u8_strconv_to_encoding (const uint8_t *string, const char\n*tocode, enum iconv_ilseq_handler handler);\n+uint8_t * u8_strconv_from_locale (const char *string);\n+char * u8_strconv_to_locale (const uint8_t *string);\n+\n+\n static int lunistring_width(lua_State *L) {\n  size_t n;\n  const uint8_t *s = (const uint8_t*)luaL_checklstring(L, 1, &n);\nStage this hunk [y,n,q,a,d,/,j,J,g,e,?]? n\n@@ -27,6 +48,17 @@ static int lunistring_width(lua_State *L) {\n }\n\n\n+int u8_strwidth (const uint8_t *s, const char *encoding);\n+void u8_wordbreaks (const uint8_t *s, size_t n, char *p);\n+void u8_possible_linebreaks (const uint8_t *s, size_t n, const char\n*encoding, char *p);\n+int u8_width_linebreaks (const uint8_t *s, size_t n, int width, int\nstart_column, int at_end_columns, const char *override, const char\n*encoding, char *p);\n+\n+\n+int uc_decomposition (ucs4_t uc, int *decomp_tag, ucs4_t *decomposition);\n+int uc_canonical_decomposition (ucs4_t uc, ucs4_t *decomposition);\n+ucs4_t uc_composition (ucs4_t uc1, ucs4_t uc2);\n+\n+\n static int lunistring_normalize(lua_State *L) {\n  uninorm_t nf = lunistring_optuninorm(L, 1);\n  size_t n;\nStage this hunk [y,n,q,a,d,/,K,j,J,g,e,?]? n\n@@ -54,6 +86,9 @@ static int lunistring_normalize(lua_State *L) {\n }\n\n\n+int u8_normcmp (const uint8_t *s1, size_t n1, const uint8_t *s2,\nsize_t n2, uninorm_t nf, int *resultp);\n+\n+\n static int lunistring_normxfrm(lua_State *L) {\n  size_t n;\n  const uint8_t *s = (const uint8_t*)luaL_checklstring(L, 1, &n);\nStage this hunk [y,n,q,a,d,/,K,j,J,g,e,?]? n\n@@ -83,6 +118,9 @@ static int lunistring_normxfrm(lua_State *L) {\n }\n\n\n+int u8_normcoll (const uint8_t *s1, size_t n1, const uint8_t *s2,\nsize_t n2, uninorm_t nf, int *resultp);\n+\n+\n static int lunistring_uc_locale_language(lua_State *L) {\n  lua_pushstring(L, uc_locale_language());\n  return 1;\nStage this hunk [y,n,q,a,d,/,K,j,J,g,e,?]? n\n@@ -173,6 +211,15 @@ static int lunistring_totitle(lua_State *L) {\n }\n\n\n+casing_prefix_context_t u8_casing_prefix_context (const uint8_t *s, size_t n);\n+casing_prefix_context_t u8_casing_prefixes_context (const uint8_t *s,\nsize_t n, casing_prefix_context_t a_context);\n+casing_suffix_context_t u8_casing_suffix_context (const uint8_t *s, size_t n);\n+casing_suffix_context_t u8_casing_suffixes_context (const uint8_t *s,\nsize_t n, casing_suffix_context_t a_context);\n+uint8_t * u8_ct_toupper (const uint8_t *s, size_t n,\ncasing_prefix_context_t prefix_context, casing_suffix_context_t\nsuffix_context, const char *iso639_language, uninorm_t nf, uint8_t\n*resultbuf, size_t *lengthp);\n+uint8_t * u8_ct_tolower (const uint8_t *s, size_t n,\ncasing_prefix_context_t prefix_context, casing_suffix_context_t\nsuffix_context, const char *iso639_language, uninorm_t nf, uint8_t\n*resultbuf, size_t *lengthp);\n+uint8_t * u8_ct_totitle (const uint8_t *s, size_t n,\ncasing_prefix_context_t prefix_context, casing_suffix_context_t\nsuffix_context, const char *iso639_language, uninorm_t nf, uint8_t\n*resultbuf, size_t *lengthp);\n+\n+\n static int lunistring_casefold(lua_State *L) {\n  size_t n;\n  const uint8_t *s = (const uint8_t*)luaL_checklstring(L, 1, &n);\nStage this hunk [y,n,q,a,d,/,K,j,J,g,e,?]? n\n@@ -201,6 +248,10 @@ static int lunistring_casefold(lua_State *L) {\n }\n\n\n+uint8_t * u8_ct_casefold (const uint8_t *s, size_t n,\ncasing_prefix_context_t prefix_context, casing_suffix_context_t\nsuffix_context, const char *iso639_language, uninorm_t nf, uint8_t\n*resultbuf, size_t *lengthp);\n+int u8_casecmp (const uint8_t *s1, size_t n1, const uint8_t *s2,\nsize_t n2, const char *iso639_language, uninorm_t nf, int *resultp);\n+\n+\n static int lunistring_casexfrm(lua_State *L) {\n  size_t n;\n  const uint8_t *s = (const uint8_t*)luaL_checklstring(L, 1, &n);\nStage this hunk [y,n,q,a,d,/,K,j,J,g,e,?]? n\n@@ -230,6 +281,9 @@ static int lunistring_casexfrm(lua_State *L) {\n }\n\n\n+int u8_casecoll (const uint8_t *s1, size_t n1, const uint8_t *s2,\nsize_t n2, const char *iso639_language, uninorm_t nf, int *resultp);\n+\n+\n static int lunistring_casecoll(lua_State *L) {\n  size_t n1, n2;\n  const uint8_t *s1 = (const uint8_t*)luaL_checklstring(L, 1, &n1);\nStage this hunk [y,n,q,a,d,/,K,j,J,g,e,?]? n\n@@ -288,7 +342,7 @@ static int lunistring_is_titlecase(lua_State *L) {\n  return luaL_fileresult(L, 0, NULL);\n  }\n\n- lua_pushboolean(L, resultp);\n+ lua_pushinteger(L, resultp);\n  return 1;\n }\n\nStage this hunk [y,n,q,a,d,/,K,g,e,?]? y\n\n$ git diff --cached\ndiff --git a/unistring/unistring.c b/unistring/unistring.c\nindex 62bbc8a..ea85d65 100644\n--- a/unistring/unistring.c\n+++ b/unistring/unistring.c\n@@ -318,7 +318,7 @@ static int lunistring_is_cased(lua_State *L) {\n                return luaL_fileresult(L, 0, NULL);\n        }\n\n-       lua_pushboolean(L, resultp);\n+       lua_pushinteger(L, resultp);\n        return 1;\n }\n"}]}