Commit Graph

8 Commits

Author SHA1 Message Date
brian m. carlson
a0065c0a48
tq: avoid spawning SSH process needlessly
When a user invokes `git archive` with LFS files, `git lfs
filter-process` is invoked to smudge the LFS files.  However, currently
when we instantiate the manifest object as part of that, an attempt is
made to connect to the remote using SSH, which we don't want to do
unless necessary.  For example, if the user already has all the files
locally, the network connection is needless and serves only to waste
resources.

In the previous commit, we made our manifest an abstract interface with
a single implementing type: a concrete manifest.  Now, introduce a lazy
manifest, which can upgrade to a concrete manifest but doesn't
instantiate one until that happens.  This allows us to instantiate a
manifest without making the SSH connection, and we can delay the SSH
connection until it's really needed, if at all.

Add a test for this case as well.
2023-03-28 15:21:58 +00:00
Chris Darroch
c7642ecdd5 commands,t: gitignore matching for fetch filters
The "lfs.fetchinclude" and "lfs.fetchexclude" Git configuration
options, if set, are used to control the action of a number of Git
LFS commands.  Since PR #4556, the "git lfs clone", "git lfs fetch",
and "git lfs pull" commands have strictly applied gitignore(5)-style
matching rules to these configuration options.

However, other commands including "git lfs filter-process" and
"git lfs smudge" now apply gitattributes(5)-style matching
rules to these same configuration options, leading to confusion.

We therefore revise all remaining uses of these configuration
options to also use gitignore-style matching rules.

We also add new tests for the "git lfs filter-process" and "git lfs
fsck" commands and adjust or expand existing tests for the "git lfs
prune" and "git lfs smudge" commands in order to confirm that
gitignore-style matching is used for all of them.  These new and
updated tests fail if gitattributes-style matching is used instead.

(Note that the "git lfs migrate" command does not require any changes
because it does not read the "lfs.fetch*" configuration options.
Instead, it supplies a "false" value for the "useFetchOptions" flag
to the determineIncludeExcludePaths() function, so any "lfs.fetch*"
configuration values are ignored.  This is significant because
"git lfs migrate" deliberately uses gitattributes-style matching
for any path patterns supplied via its -I/-X command-line arguments,
unlike all other commands that accept -I/-X arguments as overrides
for the "lfs.fetch*" configuration options.)
2022-04-27 22:13:46 -07:00
brian m. carlson
56b18085ab
smudge: honor GIT_LFS_SKIP_SMUDGE with checkout-index
In most cases, users use a relatively modern version of Git which
supports the filter-process code and delayed smudging.  This is valuable
because it makes things much faster. However, it also uses a different
code path from the non-delayed path. This non-delayed path is also used
by git checkout-index.

The non-delayed path doesn't work properly, however, if the data is
already on disk.  In such a case, we simply ask the smudge filter not to
download the data, but since it's already on disk, we feed it out
anyway.

Let's solve this by simply not invoking the filter and emitting the
pointer if we've asked to skip.  We do the same thing if the file
doesn't match the filter, since the comment at the top of the function
states that's what's supposed to happen here as well.

Once we've done that, the variable download is always true, so remove
all the code which considers that it might be false to simplify the code
somewhat.
2022-02-07 19:22:02 +00:00
brian m. carlson
9e006ac4e2
Rename default branch in tests to "main"
Currently, our default branch in tests is "master".  This is the Git
default, but the Git default will likely change in the future, so it
makes sense to update our testsuite to be explicit about the branch
name.  We'll ensure this continues by building against older versions of
Git as well as newer versions.

We use "main" for the new branch name, since that's the proposed value
upstream.

This commit was made entirely by automated means using the following
command:

  git grep -l master t | xargs sed -i -e 's/master/main/g'
2020-07-08 15:38:17 +00:00
brian m. carlson
b0d669c05b
filter-process: avoid hang when using git hash-object --stdin
When we use git hash-object --stdin with the --path option, Git applies
filters to the object, so Git LFS is invoked.  However, if the object
provided is less than 1024 bytes in size, we would hang.  This occurred
because of our packet reader didn't quite implement the io.Reader
interface completely: if it returned a non-zero value and io.EOF, the
next call to Read would not return 0 and io.EOF.  Instead, it would try
to read from stdin, which would not be sending us more data until we
provided a response, so we would hang.

To solve this, keep track of the EOF and always return it on subsequent
Read calls.  In addition, don't process the callback to write the file
in this case, since we don't actually want to write into the working
tree.
2019-11-04 19:55:45 +00:00
brian m. carlson
b2ddccd90d t: avoid using shell variables in printf's first argument
The printf(1) command, like it's C cousin, takes a format string as its
first argument.  If a shell variable is passed as the first argument, it
will be interpreted as a format string; this can lead to surprising
behavior and can cause the test suite to fail if we accidentally insert
a format string character into the variable.

Modify all the places in the individual tests that we use a plain quoted
variable as the format string by running the following Ruby one-liner:

  ruby -i -pe '$_.gsub!(/printf "\$/, %q(printf "%s" "$))' t/t-*.sh

Avoid modifying the test helpers, as there are places (such as calc_oid)
where we want to pass text containing escapes (such as "\n") and have
those be properly interpreted by printf(1).
2018-09-10 14:57:10 +00:00
Taylor Blau
de9152049c t: load shell scripts from $(dirname) instead of 't' 2018-07-10 13:51:40 -05:00
Taylor Blau
219b7e0a3d t: prefix all existing tests with t- 2018-07-09 16:24:25 -05:00