{"push_id":1146765099,"size":40,"distinct_size":9,"ref":"refs/heads/next","head":"3cd93d08f085fd56ac81614bd2e920c3b50eacec","before":"7660efa462837e74030a2c407f04bd871e96a8c3","commits":[{"sha":"9812f2136b3ebb28ccdb52e19660bffde760ff23","author":{"name":"Antoine Queru","email":"4eee7fa3110ce0a7bae2f6e02ff8b7073420ffac@grenoble-inp.org"},"message":"upload-pack.c: use parse-options API\n\nUse the parse-options API rather than a hand-rolled option parser.\n\nDescription for --stateless-rpc and --advertise-refs come from\n42526b4 (Add stateless RPC options to upload-pack,\nreceive-pack, 2009-10-30).\n\nSigned-off-by: Antoine Queru <antoine.queru@grenoble-inp.org>\nSigned-off-by: Matthieu Moy <matthieu.moy@grenoble-inp.fr>\nSigned-off-by: Junio C Hamano <gitster@pobox.com>","distinct":false,"url":"https://api.github.com/repos/git/git/commits/9812f2136b3ebb28ccdb52e19660bffde760ff23"},{"sha":"d2554c7207896136ad2033776efd29578592a3fb","author":{"name":"Jeff King","email":"7e57302763bea699aee296fb53304dc616ab92d5@peff.net"},"message":"test-lib: add in-shell \"env\" replacement\n\nThe one-shot environment variable syntax:\n\n  FOO=BAR some-program\n\nis unportable when some-program is actually a shell\nfunction, like test_must_fail (on some shells FOO remains\nset after the function returns, and on others it does not).\n\nWe sometimes get around this by using env, like:\n\n  test_must_fail env FOO=BAR some-program\n\nBut that only works because test_must_fail's arguments are\nthemselves a command which can be run. You can't run:\n\n  env FOO=BAR test_must_fail some-program\n\nbecause env does not know about our shell functions. So\nthere is no equivalent for test_commit, for example, and one\nmust resort to:\n\n  (\n    FOO=BAR\n    export FOO\n    test_commit\n  )\n\nwhich is a bit verbose.  Let's add a version of \"env\" that\nworks _inside_ the shell, by creating a subshell, exporting\nvariables from its argument list, and running the command.\n\nIts use is demonstrated on a currently-unportable case in\nt4014.\n\nSigned-off-by: Jeff King <peff@peff.net>\nSigned-off-by: Junio C Hamano <gitster@pobox.com>","distinct":false,"url":"https://api.github.com/repos/git/git/commits/d2554c7207896136ad2033776efd29578592a3fb"},{"sha":"e256eec79d375649ecda7cc21b527386898794a4","author":{"name":"Junio C Hamano","email":"3228067b6039a0d99bddaf967dafdecd5cc61600@pobox.com"},"message":"t5500 & t7403: lose bash-ism \"local\"\n\nIn t5500::check_prot_host_port_path(), diagport is not a variable\nused elsewhere and the function is not recursively called so this\ncan simply lose the \"local\", which may not be supported by shell\n(besides, the function liberally clobbers other variables without\nmaking them \"local\").\n\nt7403::reset_submodule_urls() overrides the \"root\" variable used\nin the test framework for no good reason; its use is not about\ntemporarily relocating where the test repositories are created.\nThis assignment can be made not to clobber the variable by moving\nthem into the subshells it already uses.  Its value is always\n$TRASH_DIRECTORY, so we could use it instead there, and this\nfunction that is called only once and its two subshells may not be\nnecessary (instead, the caller can use \"git -C $there config\" and\nset a value that is derived from $TRASH_DIRECTORY), but this is a\nminimum fix that is needed to lose \"local\".\n\nHelped-by: John Keeping <john@keeping.me.uk>\nHelped-by: Jeff King <peff@peff.net>\nSigned-off-by: Junio C Hamano <gitster@pobox.com>","distinct":false,"url":"https://api.github.com/repos/git/git/commits/e256eec79d375649ecda7cc21b527386898794a4"},{"sha":"fe17fc0006927246c5905ef9352e7e89a3c5814b","author":{"name":"Junio C Hamano","email":"3228067b6039a0d99bddaf967dafdecd5cc61600@pobox.com"},"message":"t2300: run git-sh-setup in an environment that better mimics the real life\n\nWhen we run scripted Porcelains, \"git\" potty has set up the $PATH by\nprepending $GIT_EXEC_PATH, the path given by \"git --exec-path=$there\n$cmd\", etc. already.  Because of this, scripted Porcelains can\ndot-source shell script library like git-sh-setup with simple dot\nwithout specifying any path.\n\nt2300 however dot-sources git-sh-setup without adjusting $PATH like\nthe real \"git\" potty does.  This has not been a problem so far, but\nonce git-sh-setup wants to rely on the $PATH adjustment, just like\nany scripted Porcelains already do, it would become one.  It cannot\nfor example dot-source another shell library without specifying the\nfull path to it by prefixing $(git --exec-path).\n\nSigned-off-by: Junio C Hamano <gitster@pobox.com>","distinct":false,"url":"https://api.github.com/repos/git/git/commits/fe17fc0006927246c5905ef9352e7e89a3c5814b"},{"sha":"ed6e8038f98e7f15e571a9a291ee4acf438b4dc5","author":{"name":"Junio C Hamano","email":"3228067b6039a0d99bddaf967dafdecd5cc61600@pobox.com"},"message":"pathspec: rename free_pathspec() to clear_pathspec()\n\nThe function takes a pointer to a pathspec structure, and releases\nthe resources held by it, but does not free() the structure itself.\nSuch a function should be called \"clear\", not \"free\".\n\nSigned-off-by: Junio C Hamano <gitster@pobox.com>","distinct":false,"url":"https://api.github.com/repos/git/git/commits/ed6e8038f98e7f15e571a9a291ee4acf438b4dc5"},{"sha":"5c9f9bf313e872934c9b4563b7b0bcdedb39eb86","author":{"name":"Jeff King","email":"7e57302763bea699aee296fb53304dc616ab92d5@peff.net"},"message":"rev-list: \"adjust\" results of \"--count --use-bitmap-index -n\"\n\nIf you ask rev-list for:\n\n    git rev-list --count --use-bitmap-index HEAD\n\nwe optimize out the actual traversal and just give you the\nnumber of bits set in the commit bitmap. This is faster,\nwhich is good.\n\nBut if you ask to limit the size of the traversal, like:\n\n    git rev-list --count --use-bitmap-index -n 100 HEAD\n\nwe'll still output the full bitmapped number we found. On\nthe surface, that might even seem OK. You explicitly asked\nto use the bitmap index, and it was cheap to compute the\nreal answer, so we gave it to you.\n\nBut there's something much more complicated going on under\nthe hood. If we don't have a bitmap directly for HEAD, then\nwe have to actually traverse backwards, looking for a\nbitmapped commit. And _that_ traversal is bounded by our\n`-n` count.\n\nThis is a good thing, because it bounds the work we have to\ndo, which is probably what the user wanted by asking for\n`-n`. But now it makes the output quite confusing. You might\nget many values:\n\n  - your `-n` value, if we walked back and never found a\n    bitmap (or fewer if there weren't that many commits)\n\n  - the actual full count, if we found a bitmap root for\n    every path of our traversal with in the `-n` limit\n\n  - any number in between! We might have walked back and\n    found _some_ bitmaps, but then cut off the traversal\n    early with some commits not accounted for in the result.\n\nSo you cannot even see a value higher than your `-n` and say\n\"OK, bitmaps kicked in, this must be the real full count\".\nThe only sane thing is for git to just clamp the value to a\nmaximum of the `-n` value, which means we should output the\nexact same results whether bitmaps are in use or not.\n\nThe test in t5310 demonstrates this by using `-n 1`.\nWithout this patch we fail in the full-bitmap case (where we\ndo not have to traverse at all) but _not_ in the\npartial-bitmap case (where we have to walk down to find an\nactual bitmap). With this patch, both cases just work.\n\nI didn't implement the crazy in-between case, just because\nit's complicated to set up, and is really a subset of the\nfull-count case, which we do cover.\n\nSigned-off-by: Jeff King <peff@peff.net>\nSigned-off-by: Junio C Hamano <gitster@pobox.com>","distinct":false,"url":"https://api.github.com/repos/git/git/commits/5c9f9bf313e872934c9b4563b7b0bcdedb39eb86"},{"sha":"fb85db84dcc36dcc3cdd5fc744280334bbe8eb47","author":{"name":"Jeff King","email":"7e57302763bea699aee296fb53304dc616ab92d5@peff.net"},"message":"rev-list: disable bitmaps when \"-n\" is used with listing objects\n\nYou can ask rev-list to use bitmaps to speed up an --objects\ntraversal, which should generally give you your answers much\nfaster.\n\nLikewise, you can ask rev-list to limit such a traversal\nwith `-n`, in which case we'll show only a limited set of\ncommits (and only the tree and commit objects directly\nreachable from those commits).\n\nBut if you do both together, the results are nonsensical. We\nend up limiting any fallback traversal we do to _find_ the\nbitmaps, but the actual set of objects we output will be\npicked arbitrarily from the union of any bitmaps we do find,\nand will involve the objects of many more commits.\n\nIt's possible that somebody might want this as a \"show me\nwhat you can, but limit the amount of work you do\" flag.\nBut as with the prior commit clamping \"--count\", the results\nare basically non-deterministic; you'll get the values from\nsome commits between `n` and the total number, and you can't\ntell which.\n\nAnd unlike the `--count` case, we can't easily generate the\n\"real\" value from the bitmap values (you can't just walk\nback `-n` commits and subtract out the reachable objects\nfrom the boundary commits; the bitmaps for `X` record its\ntotal reachability, so you don't know which objects are\ndirectly from `X` itself, which from `X^`, and so on).\n\nSo let's just fallback to the non-bitmap code path in this\ncase, so we always give a sane answer.\n\nSigned-off-by: Jeff King <peff@peff.net>\nSigned-off-by: Junio C Hamano <gitster@pobox.com>","distinct":false,"url":"https://api.github.com/repos/git/git/commits/fb85db84dcc36dcc3cdd5fc744280334bbe8eb47"},{"sha":"0719f3eecd1234f6331cab980088239207e93335","author":{"name":"William Duclot","email":"1645d9f51d7bb59095ef0045b62fe2ae2d2cb936@ensimag.grenoble-inp.fr"},"message":"userdiff: add built-in pattern for CSS\n\nCSS is widely used, motivating it being included as a built-in pattern.\n\nIt must be noted that the word_regex for CSS (i.e. the regex defining\nwhat is a word in the language) does not consider '.' and '#' characters\n(in CSS selectors) to be part of the word. This behavior is documented\nby the test t/t4018/css-rule.\nThe logic behind this behavior is the following: identifiers in CSS\nselectors are identifiers in a HTML/XML document. Therefore, the '.'/'#'\ncharacter are not part of the identifier, but an indicator of the nature\nof the identifier in HTML/XML (class or id). Diffing \".class1\" and\n\".class2\" must show that the class name is changed, but we still are\nselecting a class.\n\nLogic behind the \"pattern\" regex is:\n    1. reject lines ending with a colon/semicolon (properties)\n    2. if a line begins with a name in column 1, pick the whole line\n\nCredits to Johannes Sixt (j6t@kdbg.org) for the pattern regex and most\nof the tests.\n\nSigned-off-by: William Duclot <william.duclot@ensimag.grenoble-inp.fr>\nSigned-off-by: Matthieu Moy <matthieu.moy@grenoble-inp.fr>\nReviewed-by: Johannes Sixt <j6t@kdbg.org>\nSigned-off-by: Junio C Hamano <gitster@pobox.com>","distinct":false,"url":"https://api.github.com/repos/git/git/commits/0719f3eecd1234f6331cab980088239207e93335"},{"sha":"2e279288c67150339ddbc5668ba18b2d404117d4","author":{"name":"Michael Haggerty","email":"63ccb4d9e500fc508c7d045328459e7f9a66afd1@alum.mit.edu"},"message":"refs: remove unnecessary \"extern\" keywords\n\nThere's continuing work in this area, so clean up unneeded \"extern\"\nkeywords rather than schlepping them around. Also split up some overlong\nlines and add parameter names in a couple of places.\n\nSigned-off-by: Michael Haggerty <mhagger@alum.mit.edu>\nSigned-off-by: Junio C Hamano <gitster@pobox.com>","distinct":false,"url":"https://api.github.com/repos/git/git/commits/2e279288c67150339ddbc5668ba18b2d404117d4"},{"sha":"78212debdced9b5ca33eac0f7548bf3fa3c5d1b5","author":{"name":"Michael Haggerty","email":"63ccb4d9e500fc508c7d045328459e7f9a66afd1@alum.mit.edu"},"message":"do_for_each_ref(): move docstring to the header file\n\nSigned-off-by: Michael Haggerty <mhagger@alum.mit.edu>\nSigned-off-by: Junio C Hamano <gitster@pobox.com>","distinct":false,"url":"https://api.github.com/repos/git/git/commits/78212debdced9b5ca33eac0f7548bf3fa3c5d1b5"},{"sha":"22a07c752bc105dae9a2d30149eca58f57d6650a","author":{"name":"Michael Haggerty","email":"63ccb4d9e500fc508c7d045328459e7f9a66afd1@alum.mit.edu"},"message":"refs: use name \"prefix\" consistently\n\nIn the context of the for_each_ref() functions, call the prefix that\nreferences must start with \"prefix\". (In some places it was called\n\"base\".) This is clearer, and also prevents confusion with another\nplanned use of the word \"base\".\n\nSigned-off-by: Michael Haggerty <mhagger@alum.mit.edu>\nSigned-off-by: Junio C Hamano <gitster@pobox.com>","distinct":false,"url":"https://api.github.com/repos/git/git/commits/22a07c752bc105dae9a2d30149eca58f57d6650a"},{"sha":"99350699b854ac107ec86e95304c2f0fbe2871e7","author":{"name":"Michael Haggerty","email":"63ccb4d9e500fc508c7d045328459e7f9a66afd1@alum.mit.edu"},"message":"delete_refs(): add a flags argument\n\nThis will be useful for passing REF_NODEREF through.\n\nSigned-off-by: Michael Haggerty <mhagger@alum.mit.edu>\nSigned-off-by: Junio C Hamano <gitster@pobox.com>","distinct":false,"url":"https://api.github.com/repos/git/git/commits/99350699b854ac107ec86e95304c2f0fbe2871e7"},{"sha":"8d42d3a0ec52a9be361bcf24290e4e9c75301e20","author":{"name":"Michael Haggerty","email":"63ccb4d9e500fc508c7d045328459e7f9a66afd1@alum.mit.edu"},"message":"remote rm: handle symbolic refs correctly\n\nIn the modern world of reference backends, it is not OK to delete a\nsymref by unlink()ing the file directly. This must be done via the refs\nAPI.\n\nWe do so by adding the symref to the list of references to delete along\nwith the non-symbolic references, then calling delete_refs() with the\nnew flags option set to REF_NODEREF.\n\nSigned-off-by: Michael Haggerty <mhagger@alum.mit.edu>\nSigned-off-by: Junio C Hamano <gitster@pobox.com>","distinct":false,"url":"https://api.github.com/repos/git/git/commits/8d42d3a0ec52a9be361bcf24290e4e9c75301e20"},{"sha":"9f0cfce5d100392001b206e9e22083994308092d","author":{"name":"Michael Haggerty","email":"63ccb4d9e500fc508c7d045328459e7f9a66afd1@alum.mit.edu"},"message":"get_ref_cache(): only create an instance if there is a submodule\n\nIf there is not a nonbare repository where a submodule is supposedly\nlocated, then don't instantiate a ref_cache for it.\n\nThe analogous check can be removed from resolve_gitlink_ref().\n\nSigned-off-by: Michael Haggerty <mhagger@alum.mit.edu>\nSigned-off-by: Junio C Hamano <gitster@pobox.com>","distinct":false,"url":"https://api.github.com/repos/git/git/commits/9f0cfce5d100392001b206e9e22083994308092d"},{"sha":"50833a232214926909fcfdb725d6cec9169ad1bd","author":{"name":"Michael Haggerty","email":"63ccb4d9e500fc508c7d045328459e7f9a66afd1@alum.mit.edu"},"message":"entry_resolves_to_object(): rename function from ref_resolves_to_object()\n\nFree up the old name for a more general purpose.\n\nSigned-off-by: Michael Haggerty <mhagger@alum.mit.edu>\nSigned-off-by: Junio C Hamano <gitster@pobox.com>","distinct":false,"url":"https://api.github.com/repos/git/git/commits/50833a232214926909fcfdb725d6cec9169ad1bd"},{"sha":"e30107cba54a0de12fa4e3e1cf636082811770f5","author":{"name":"Michael Haggerty","email":"63ccb4d9e500fc508c7d045328459e7f9a66afd1@alum.mit.edu"},"message":"ref_resolves_to_object(): new function\n\nExtract new function ref_resolves_to_object() from\nentry_resolves_to_object(). It can be used even if there is no ref_entry\nat hand.\n\nSigned-off-by: Michael Haggerty <mhagger@alum.mit.edu>\nSigned-off-by: Junio C Hamano <gitster@pobox.com>","distinct":false,"url":"https://api.github.com/repos/git/git/commits/e30107cba54a0de12fa4e3e1cf636082811770f5"},{"sha":"dbc8db442398e406e7bdc6d1ad044f972dbf89de","author":{"name":"Michael Haggerty","email":"63ccb4d9e500fc508c7d045328459e7f9a66afd1@alum.mit.edu"},"message":"refs: introduce an iterator interface\n\nCurrently, the API for iterating over references is via a family of\nfor_each_ref()-type functions that invoke a callback function for each\nselected reference. All of these eventually call do_for_each_ref(),\nwhich knows how to do one thing: iterate in parallel through two\nref_caches, one for loose and one for packed refs, giving loose\nreferences precedence over packed refs. This is rather complicated code,\nand is quite specialized to the files backend. It also requires callers\nto encapsulate their work into a callback function, which often means\nthat they have to define and use a \"cb_data\" struct to manage their\ncontext.\n\nThe current design is already bursting at the seams, and will become\neven more awkward in the upcoming world of multiple reference storage\nbackends:\n\n* Per-worktree vs. shared references are currently handled via a kludge\n  in git_path() rather than iterating over each part of the reference\n  namespace separately and merging the results. This kludge will cease\n  to work when we have multiple reference storage backends.\n\n* The current scheme is inflexible. What if we sometimes want to bypass\n  the ref_cache, or use it only for packed or only for loose refs? What\n  if we want to store symbolic refs in one type of storage backend and\n  non-symbolic ones in another?\n\nIn the future, each reference backend will need to define its own way of\niterating over references. The crux of the problem with the current\ndesign is that it is impossible to compose for_each_ref()-style\niterations, because the flow of control is owned by the for_each_ref()\nfunction. There is nothing that a caller can do but iterate through all\nreferences in a single burst, so there is no way for it to interleave\nreferences from multiple backends and present the result to the rest of\nthe world as a single compound backend.\n\nThis commit introduces a new iteration primitive for references: a\nref_iterator. A ref_iterator is a polymorphic object that a reference\nstorage backend can be asked to instantiate. There are three functions\nthat can be applied to a ref_iterator:\n\n* ref_iterator_advance(): move to the next reference in the iteration\n* ref_iterator_abort(): end the iteration before it is exhausted\n* ref_iterator_peel(): peel the reference currently being looked at\n\nIterating using a ref_iterator leaves the flow of control in the hands\nof the caller, which means that ref_iterators from multiple\nsources (e.g., loose and packed refs) can be composed and presented to\nthe world as a single compound ref_iterator.\n\nIt also means that the backend code for implementing reference iteration\nwill sometimes be more complicated. For example, the\ncache_ref_iterator (which iterates over a ref_cache) can't use the C\nstack to recurse; instead, it must manage its own stack internally as\nexplicit data structures. There is also a lot of boilerplate connected\nwith object-oriented programming in C.\n\nEventually, end-user callers will be able to be written in a more\nnatural way—managing their own flow of control rather than having to\nwork via callbacks. Since there will only be a few reference backends\nbut there are many consumers of this API, this is a good tradeoff.\n\nMore importantly, we gain composability, and especially the possibility\nof writing interchangeable parts that can work with any ref_iterator.\n\nFor example, merge_ref_iterator implements a generic way of merging the\ncontents of any two ref_iterators. It is used to merge loose + packed\nrefs as part of the implementation of the files_ref_iterator. But it\nwill also be possible to use it to merge other pairs of reference\nsources (e.g., per-worktree vs. shared refs).\n\nAnother example is prefix_ref_iterator, which can be used to trim a\nprefix off the front of reference names before presenting them to the\ncaller (e.g., \"refs/heads/master\" -> \"master\").\n\nIn this patch, we introduce the iterator abstraction and many utilities,\nand implement a reference iterator for the files ref storage backend.\n(I've written several other obvious utilities, for example a generic way\nto filter references being iterated over. These will probably be useful\nin the future. But they are not needed for this patch series, so I am\nnot including them at this time.)\n\nIn a moment we will rewrite do_for_each_ref() to work via reference\niterators (allowing some special-purpose code to be discarded), and do\nsomething similar for reflogs. In future patch series, we will expose\nthe ref_iterator abstraction in the public refs API so that callers can\nuse it directly.\n\nImplementation note: I tried abstracting this a layer further to allow\ngeneric iterators (over arbitrary types of objects) and generic\nutilities like a generic merge_iterator. But the implementation in C was\nvery cumbersome, involving (in my opinion) too much boilerplate and too\nmuch unsafe casting, some of which would have had to be done on the\ncaller side. However, I did put a few iterator-related constants in a\ntop-level header file, iterator.h, as they will be useful in a moment to\nimplement iteration over directory trees and possibly other types of\niterators in the future.\n\nSigned-off-by: Michael Haggerty <mhagger@alum.mit.edu>\nSigned-off-by: Junio C Hamano <gitster@pobox.com>","distinct":false,"url":"https://api.github.com/repos/git/git/commits/dbc8db442398e406e7bdc6d1ad044f972dbf89de"},{"sha":"f4e8f95d5e29eb598fd249d6966d191f152add45","author":{"name":"Michael Haggerty","email":"63ccb4d9e500fc508c7d045328459e7f9a66afd1@alum.mit.edu"},"message":"do_for_each_ref(): reimplement using reference iteration\n\nUse the reference iterator interface to implement do_for_each_ref().\nDelete a bunch of code supporting the old for_each_ref() implementation.\nAnd now that do_for_each_ref() is generic code (it is no longer tied to\nthe files backend), move it to refs.c.\n\nThe implementation is via a new function, do_for_each_ref_iterator(),\nwhich takes a reference iterator as argument and calls a callback\nfunction for each of the references in the iterator.\n\nThis change requires the current_ref performance hack for peel_ref() to\nbe implemented via ref_iterator_peel() rather than peel_entry() because\nwe don't have a ref_entry handy (it is hidden under three layers:\nfile_ref_iterator, merge_ref_iterator, and cache_ref_iterator). So:\n\n* do_for_each_ref_iterator() records the active iterator in\n  current_ref_iter while it is running.\n\n* peel_ref() checks whether current_ref_iter is pointing at the\n  requested reference. If so, it asks the iterator to peel the\n  reference (which it can do efficiently via its \"peel\" virtual\n  function). For extra safety, we do the optimization only if the\n  refname *addresses* are the same, not only if the refname *strings*\n  are the same, to forestall possible mixups between refnames that come\n  from different ref_iterators.\n\nPlease note that this optimization of peel_ref() is only available when\niterating via do_for_each_ref_iterator() (including all of the\nfor_each_ref() functions, which call it indirectly). It would be\ncomplicated to implement a similar optimization when iterating directly\nusing a reference iterator, because multiple reference iterators can be\nin use at the same time, with interleaved calls to\nref_iterator_advance(). (In fact we do exactly that in\nmerge_ref_iterator.)\n\nBut that is not necessary. peel_ref() is only called while iterating\nover references. Callers who iterate using the for_each_ref() functions\nbenefit from the optimization described above. Callers who iterate using\nreference iterators directly have access to the ref_iterator, so they\ncan call ref_iterator_peel() themselves to get an analogous optimization\nin a more straightforward manner.\n\nIf we rewrite all callers to use the reference iteration API, then we\ncan remove the current_ref_iter hack permanently.\n\nSigned-off-by: Michael Haggerty <mhagger@alum.mit.edu>\nSigned-off-by: Junio C Hamano <gitster@pobox.com>","distinct":false,"url":"https://api.github.com/repos/git/git/commits/f4e8f95d5e29eb598fd249d6966d191f152add45"},{"sha":"922428b73fe0f41a20b88ae31fa265ba2c5fb54c","author":{"name":"Michael Haggerty","email":"63ccb4d9e500fc508c7d045328459e7f9a66afd1@alum.mit.edu"},"message":"for_each_reflog(): don't abort for bad references\n\nIf there is a file under \"$GIT_DIR/logs\" with no corresponding\nreference, the old code was emitting an error message, aborting the\nreflog iteration, and returning -1. But\n\n* None of the callers was checking the exit value\n\n* The callers all want to find all legitimate reflogs (sometimes for the\n  purpose of determining object reachability!) and wouldn't benefit from\n  a truncated iteration anyway.\n\nSo instead, emit an error message and skip the \"broken\" reflog, but\ncontinue with the iteration.\n\nSigned-off-by: Michael Haggerty <mhagger@alum.mit.edu>\nSigned-off-by: Junio C Hamano <gitster@pobox.com>","distinct":false,"url":"https://api.github.com/repos/git/git/commits/922428b73fe0f41a20b88ae31fa265ba2c5fb54c"},{"sha":"832803edeac314d0a3fa1214ddf62915c31574ce","author":{"name":"Michael Haggerty","email":"63ccb4d9e500fc508c7d045328459e7f9a66afd1@alum.mit.edu"},"message":"dir_iterator: new API for iterating over a directory tree\n\nThe iterator interface is modeled on that for references, though no\nvtable is necessary because there is (so far?) only one type of\ndir_iterator.\n\nThere are obviously a lot of features that could easily be added to this\nclass:\n\n* Skip/include directory paths in the iteration\n* Shallow/deep iteration\n* Letting the caller decide which subdirectories to recurse into (e.g.,\n  via a dir_iterator_advance_into() function)\n* Option to iterate in sorted order\n* Option to iterate over directory paths before vs. after their contents\n\nBut these are not needed for the current patch series, so I refrain.\n\nSigned-off-by: Michael Haggerty <mhagger@alum.mit.edu>\nSigned-off-by: Junio C Hamano <gitster@pobox.com>","distinct":false,"url":"https://api.github.com/repos/git/git/commits/832803edeac314d0a3fa1214ddf62915c31574ce"}]}
{"actor":{"display_login":"gitster"}}