2006-09-08 12:05:34 +04:00
|
|
|
#ifndef STATUS_H
|
|
|
|
#define STATUS_H
|
|
|
|
|
2009-08-05 10:49:33 +04:00
|
|
|
#include "string-list.h"
|
2009-08-10 10:08:40 +04:00
|
|
|
#include "color.h"
|
2015-08-20 17:06:27 +03:00
|
|
|
#include "pathspec.h"
|
2017-08-22 18:54:23 +03:00
|
|
|
#include "pkt-line.h"
|
2018-01-09 21:50:16 +03:00
|
|
|
#include "remote.h"
|
2007-09-18 04:06:42 +04:00
|
|
|
|
2018-11-10 08:48:49 +03:00
|
|
|
struct repository;
|
2016-04-22 16:01:31 +03:00
|
|
|
struct worktree;
|
|
|
|
|
2006-09-08 12:05:34 +04:00
|
|
|
enum color_wt_status {
|
2009-08-10 10:08:40 +04:00
|
|
|
WT_STATUS_HEADER = 0,
|
2006-09-08 12:05:34 +04:00
|
|
|
WT_STATUS_UPDATED,
|
|
|
|
WT_STATUS_CHANGED,
|
|
|
|
WT_STATUS_UNTRACKED,
|
2008-05-22 16:50:02 +04:00
|
|
|
WT_STATUS_NOBRANCH,
|
2009-08-05 11:04:51 +04:00
|
|
|
WT_STATUS_UNMERGED,
|
2010-05-25 17:45:51 +04:00
|
|
|
WT_STATUS_LOCAL_BRANCH,
|
2010-11-18 02:40:05 +03:00
|
|
|
WT_STATUS_REMOTE_BRANCH,
|
|
|
|
WT_STATUS_ONBRANCH,
|
|
|
|
WT_STATUS_MAXSLOT
|
2006-09-08 12:05:34 +04:00
|
|
|
};
|
|
|
|
|
2008-06-05 12:31:19 +04:00
|
|
|
enum untracked_status_type {
|
2008-06-05 16:22:56 +04:00
|
|
|
SHOW_NO_UNTRACKED_FILES,
|
|
|
|
SHOW_NORMAL_UNTRACKED_FILES,
|
2017-08-22 18:54:23 +03:00
|
|
|
SHOW_ALL_UNTRACKED_FILES,
|
|
|
|
SHOW_COMPLETE_UNTRACKED_FILES,
|
2008-06-05 12:31:19 +04:00
|
|
|
};
|
|
|
|
|
status: add option to show ignored files differently
Teach the status command more flexibility in how ignored files are
reported. Currently, the reporting of ignored files and untracked
files are linked. You cannot control how ignored files are reported
independently of how untracked files are reported (i.e. `all` vs
`normal`). This makes it impossible to show untracked files with the
`all` option, but show ignored files with the `normal` option.
This work 1) adds the ability to control the reporting of ignored
files independently of untracked files and 2) introduces the concept
of status reporting ignored paths that explicitly match an ignored
pattern. There are 2 benefits to these changes: 1) if a consumer needs
all untracked files but not all ignored files, there is a performance
benefit to not scanning all contents of an ignored directory and 2)
returning ignored files that explicitly match a path allow a consumer
to make more informed decisions about when a status result might be
stale.
This commit implements --ignored=matching with --untracked-files=all.
The following commit will implement --ignored=matching with
--untracked=files=normal.
As an example of where this flexibility could be useful is that our
application (Visual Studio) runs the status command and presents the
output. It shows all untracked files individually (e.g. using the
'--untracked-files==all' option), and would like to know about which
paths are ignored. It uses information about ignored paths to make
decisions about when the status result might have changed.
Additionally, many projects place build output into directories inside
a repository's working directory (e.g. in "bin/" and "obj/"
directories). Normal usage is to explicitly ignore these 2 directory
names in the .gitignore file (rather than or in addition to the *.obj
pattern).If an application could know that these directories are
explicitly ignored, it could infer that all contents are ignored as
well and make better informed decisions about files in these
directories. It could infer that any changes under these paths would
not affect the output of status. Additionally, there can be a
significant performance benefit by avoiding scanning through ignored
directories.
When status is set to report matching ignored files, it has the
following behavior. Ignored files and directories that explicitly
match an exclude pattern are reported. If an ignored directory matches
an exclude pattern, then the path of the directory is returned. If a
directory does not match an exclude pattern, but all of its contents
are ignored, then the contained files are reported instead of the
directory.
Signed-off-by: Jameson Miller <jamill@microsoft.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2017-10-30 20:21:37 +03:00
|
|
|
enum show_ignored_type {
|
|
|
|
SHOW_NO_IGNORED,
|
|
|
|
SHOW_TRADITIONAL_IGNORED,
|
|
|
|
SHOW_MATCHING_IGNORED,
|
|
|
|
};
|
|
|
|
|
2011-02-20 07:12:29 +03:00
|
|
|
/* from where does this commit originate */
|
|
|
|
enum commit_whence {
|
|
|
|
FROM_COMMIT, /* normal */
|
|
|
|
FROM_MERGE, /* commit came from merge */
|
|
|
|
FROM_CHERRY_PICK /* commit came from cherry-pick */
|
|
|
|
};
|
|
|
|
|
2009-08-05 10:49:33 +04:00
|
|
|
struct wt_status_change_data {
|
|
|
|
int worktree_status;
|
|
|
|
int index_status;
|
|
|
|
int stagemask;
|
2016-08-11 17:45:57 +03:00
|
|
|
int mode_head, mode_index, mode_worktree;
|
|
|
|
struct object_id oid_head, oid_index;
|
2017-12-27 13:18:38 +03:00
|
|
|
int rename_status;
|
|
|
|
int rename_score;
|
|
|
|
char *rename_source;
|
2010-03-08 15:53:19 +03:00
|
|
|
unsigned dirty_submodule : 2;
|
|
|
|
unsigned new_submodule_commits : 1;
|
2009-08-05 10:49:33 +04:00
|
|
|
};
|
|
|
|
|
2016-08-06 01:00:27 +03:00
|
|
|
enum wt_status_format {
|
|
|
|
STATUS_FORMAT_NONE = 0,
|
|
|
|
STATUS_FORMAT_LONG,
|
|
|
|
STATUS_FORMAT_SHORT,
|
|
|
|
STATUS_FORMAT_PORCELAIN,
|
2016-08-11 17:45:57 +03:00
|
|
|
STATUS_FORMAT_PORCELAIN_V2,
|
2017-08-22 18:54:23 +03:00
|
|
|
STATUS_FORMAT_SERIALIZE_V1,
|
2016-08-06 01:00:27 +03:00
|
|
|
|
|
|
|
STATUS_FORMAT_UNSPECIFIED
|
|
|
|
};
|
|
|
|
|
2019-06-19 01:29:15 +03:00
|
|
|
#define HEAD_DETACHED_AT _("HEAD detached at ")
|
|
|
|
#define HEAD_DETACHED_FROM _("HEAD detached from ")
|
|
|
|
|
2018-09-30 17:12:45 +03:00
|
|
|
struct wt_status_state {
|
|
|
|
int merge_in_progress;
|
|
|
|
int am_in_progress;
|
|
|
|
int am_empty_patch;
|
|
|
|
int rebase_in_progress;
|
|
|
|
int rebase_interactive_in_progress;
|
|
|
|
int cherry_pick_in_progress;
|
|
|
|
int bisect_in_progress;
|
|
|
|
int revert_in_progress;
|
|
|
|
int detached_at;
|
|
|
|
char *branch;
|
|
|
|
char *onto;
|
|
|
|
char *detached_from;
|
|
|
|
struct object_id detached_oid;
|
|
|
|
struct object_id revert_head_oid;
|
|
|
|
struct object_id cherry_pick_head_oid;
|
|
|
|
};
|
|
|
|
|
2006-09-08 12:05:34 +04:00
|
|
|
struct wt_status {
|
2018-11-10 08:48:49 +03:00
|
|
|
struct repository *repo;
|
2006-09-08 12:05:34 +04:00
|
|
|
int is_initial;
|
|
|
|
char *branch;
|
|
|
|
const char *reference;
|
2013-07-14 12:35:39 +04:00
|
|
|
struct pathspec pathspec;
|
2006-09-08 12:05:34 +04:00
|
|
|
int verbose;
|
|
|
|
int amend;
|
2011-02-20 07:12:29 +03:00
|
|
|
enum commit_whence whence;
|
2007-12-13 06:09:16 +03:00
|
|
|
int nowarn;
|
2009-08-10 08:59:30 +04:00
|
|
|
int use_color;
|
2014-03-20 16:12:41 +04:00
|
|
|
int no_gettext;
|
2013-09-06 21:43:07 +04:00
|
|
|
int display_comment_prefix;
|
2009-08-10 08:59:30 +04:00
|
|
|
int relative_paths;
|
|
|
|
int submodule_summary;
|
status: add option to show ignored files differently
Teach the status command more flexibility in how ignored files are
reported. Currently, the reporting of ignored files and untracked
files are linked. You cannot control how ignored files are reported
independently of how untracked files are reported (i.e. `all` vs
`normal`). This makes it impossible to show untracked files with the
`all` option, but show ignored files with the `normal` option.
This work 1) adds the ability to control the reporting of ignored
files independently of untracked files and 2) introduces the concept
of status reporting ignored paths that explicitly match an ignored
pattern. There are 2 benefits to these changes: 1) if a consumer needs
all untracked files but not all ignored files, there is a performance
benefit to not scanning all contents of an ignored directory and 2)
returning ignored files that explicitly match a path allow a consumer
to make more informed decisions about when a status result might be
stale.
This commit implements --ignored=matching with --untracked-files=all.
The following commit will implement --ignored=matching with
--untracked=files=normal.
As an example of where this flexibility could be useful is that our
application (Visual Studio) runs the status command and presents the
output. It shows all untracked files individually (e.g. using the
'--untracked-files==all' option), and would like to know about which
paths are ignored. It uses information about ignored paths to make
decisions about when the status result might have changed.
Additionally, many projects place build output into directories inside
a repository's working directory (e.g. in "bin/" and "obj/"
directories). Normal usage is to explicitly ignore these 2 directory
names in the .gitignore file (rather than or in addition to the *.obj
pattern).If an application could know that these directories are
explicitly ignored, it could infer that all contents are ignored as
well and make better informed decisions about files in these
directories. It could infer that any changes under these paths would
not affect the output of status. Additionally, there can be a
significant performance benefit by avoiding scanning through ignored
directories.
When status is set to report matching ignored files, it has the
following behavior. Ignored files and directories that explicitly
match an exclude pattern are reported. If an ignored directory matches
an exclude pattern, then the path of the directory is returned. If a
directory does not match an exclude pattern, but all of its contents
are ignored, then the contained files are reported instead of the
directory.
Signed-off-by: Jameson Miller <jamill@microsoft.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2017-10-30 20:21:37 +03:00
|
|
|
enum show_ignored_type show_ignored_mode;
|
2009-08-10 08:59:30 +04:00
|
|
|
enum untracked_status_type show_untracked_files;
|
2010-06-25 18:56:47 +04:00
|
|
|
const char *ignore_submodule_arg;
|
2010-11-18 02:40:05 +03:00
|
|
|
char color_palette[WT_STATUS_MAXSLOT][COLOR_MAXLEN];
|
2012-05-07 23:35:03 +04:00
|
|
|
unsigned colopts;
|
2012-05-07 23:44:44 +04:00
|
|
|
int null_termination;
|
2017-06-21 21:16:14 +03:00
|
|
|
int commit_template;
|
2012-05-08 01:09:04 +04:00
|
|
|
int show_branch;
|
2017-06-18 01:30:51 +03:00
|
|
|
int show_stash;
|
2013-09-12 14:50:05 +04:00
|
|
|
int hints;
|
2018-01-09 21:50:16 +03:00
|
|
|
enum ahead_behind_flags ahead_behind_flags;
|
2018-05-11 18:38:58 +03:00
|
|
|
int detect_rename;
|
|
|
|
int rename_score;
|
|
|
|
int rename_limit;
|
2016-08-06 01:00:27 +03:00
|
|
|
enum wt_status_format status_format;
|
2018-09-30 17:12:45 +03:00
|
|
|
struct wt_status_state state;
|
2019-08-18 23:04:21 +03:00
|
|
|
struct object_id oid_commit; /* when not Initial */
|
2016-08-06 01:00:27 +03:00
|
|
|
|
2007-01-11 01:25:03 +03:00
|
|
|
/* These are computed during processing of the individual sections */
|
2018-09-06 03:53:27 +03:00
|
|
|
int committable;
|
2007-01-11 01:25:03 +03:00
|
|
|
int workdir_dirty;
|
2007-09-18 04:06:43 +04:00
|
|
|
const char *index_file;
|
2007-09-18 04:06:42 +04:00
|
|
|
FILE *fp;
|
2007-11-11 20:35:41 +03:00
|
|
|
const char *prefix;
|
2009-08-05 10:49:33 +04:00
|
|
|
struct string_list change;
|
2009-08-10 11:36:33 +04:00
|
|
|
struct string_list untracked;
|
2010-04-10 11:11:53 +04:00
|
|
|
struct string_list ignored;
|
2013-03-13 16:59:16 +04:00
|
|
|
uint32_t untracked_in_ms;
|
2006-09-08 12:05:34 +04:00
|
|
|
};
|
|
|
|
|
interpret-trailers: honor the cut line
If a commit message is edited with the "verbose" option, the buffer
will have a cut line and diff after the log message, like so:
my subject
# ------------------------ >8 ------------------------
# Do not touch the line above.
# Everything below will be removed.
diff --git a/foo.txt b/foo.txt
index 5716ca5..7601807 100644
--- a/foo.txt
+++ b/foo.txt
@@ -1 +1 @@
-bar
+baz
"git interpret-trailers" is unaware of the cut line, and assumes the
trailer block would be at the end of the whole thing. This can easily
be seen with:
$ GIT_EDITOR='git interpret-trailers --in-place --trailer Acked-by:me' \
git commit --amend -v
Teach "git interpret-trailers" to notice the cut-line and ignore the
remainder of the input when looking for a place to add new trailer
block. This makes it consistent with how "git commit -v -s" inserts a
new Signed-off-by: line.
This can be done by the same logic as the existing helper function,
wt_status_truncate_message_at_cut_line(), uses, but it wants the caller
to pass a strbuf to it. Because the function ignore_non_trailer() used
by the command takes a <pointer, length> pair, not a strbuf, steal the
logic from wt_status_truncate_message_at_cut_line() to create a new
wt_status_locate_end() helper function that takes <pointer, length>
pair, and make ignore_non_trailer() call it to help "interpret-trailers".
Since there is only one caller of wt_status_truncate_message_at_cut_line()
in cmd_commit(), rewrite it to call wt_status_locate_end() helper instead
and remove the old helper that no longer has any caller.
Signed-off-by: Brian Malehorn <bmalehorn@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2017-05-16 09:06:49 +03:00
|
|
|
size_t wt_status_locate_end(const char *s, size_t len);
|
2019-04-17 13:23:27 +03:00
|
|
|
void wt_status_append_cut_line(struct strbuf *buf);
|
2014-02-17 16:15:31 +04:00
|
|
|
void wt_status_add_cut_line(FILE *fp);
|
2018-11-10 08:48:49 +03:00
|
|
|
void wt_status_prepare(struct repository *r, struct wt_status *s);
|
2016-08-06 01:00:27 +03:00
|
|
|
void wt_status_print(struct wt_status *s);
|
2009-08-10 11:36:33 +04:00
|
|
|
void wt_status_collect(struct wt_status *s);
|
2018-09-30 17:12:45 +03:00
|
|
|
void wt_status_collect_free_buffers(struct wt_status *s);
|
2018-11-10 08:48:50 +03:00
|
|
|
void wt_status_get_state(struct repository *repo,
|
|
|
|
struct wt_status_state *state,
|
|
|
|
int get_detached_from);
|
2016-04-22 16:01:31 +03:00
|
|
|
int wt_status_check_rebase(const struct worktree *wt,
|
|
|
|
struct wt_status_state *state);
|
2016-04-22 16:01:34 +03:00
|
|
|
int wt_status_check_bisect(const struct worktree *wt,
|
|
|
|
struct wt_status_state *state);
|
2006-09-08 12:05:34 +04:00
|
|
|
|
2013-07-10 04:23:28 +04:00
|
|
|
__attribute__((format (printf, 3, 4)))
|
|
|
|
void status_printf_ln(struct wt_status *s, const char *color, const char *fmt, ...);
|
|
|
|
__attribute__((format (printf, 3, 4)))
|
|
|
|
void status_printf(struct wt_status *s, const char *color, const char *fmt, ...);
|
2011-02-26 08:09:41 +03:00
|
|
|
|
2016-10-07 19:08:56 +03:00
|
|
|
/* The following functions expect that the caller took care of reading the index. */
|
2018-11-10 08:48:49 +03:00
|
|
|
int has_unstaged_changes(struct repository *repo,
|
|
|
|
int ignore_submodules);
|
|
|
|
int has_uncommitted_changes(struct repository *repo,
|
|
|
|
int ignore_submodules);
|
|
|
|
int require_clean_work_tree(struct repository *repo,
|
|
|
|
const char *action,
|
|
|
|
const char *hint,
|
|
|
|
int ignore_submodules,
|
|
|
|
int gently);
|
2016-10-07 19:08:38 +03:00
|
|
|
|
2017-08-22 18:54:23 +03:00
|
|
|
#define DESERIALIZE_OK 0
|
|
|
|
#define DESERIALIZE_ERR 1
|
|
|
|
|
|
|
|
struct wt_status_serialize_data_fixed
|
|
|
|
{
|
|
|
|
uint32_t worktree_status;
|
|
|
|
uint32_t index_status;
|
|
|
|
uint32_t stagemask;
|
2018-07-25 19:03:22 +03:00
|
|
|
uint32_t rename_status;
|
2017-08-22 18:54:23 +03:00
|
|
|
uint32_t rename_score;
|
|
|
|
uint32_t mode_head;
|
|
|
|
uint32_t mode_index;
|
|
|
|
uint32_t mode_worktree;
|
|
|
|
uint32_t dirty_submodule;
|
|
|
|
uint32_t new_submodule_commits;
|
|
|
|
struct object_id oid_head;
|
|
|
|
struct object_id oid_index;
|
|
|
|
};
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Consume the maximum amount of data possible in a
|
|
|
|
* packet-line record. This is overkill because we
|
|
|
|
* have at most 2 relative pathnames, but means we
|
|
|
|
* don't need to allocate a variable length structure.
|
|
|
|
*/
|
|
|
|
struct wt_status_serialize_data
|
|
|
|
{
|
|
|
|
struct wt_status_serialize_data_fixed fixed;
|
|
|
|
char variant[LARGE_PACKET_DATA_MAX
|
|
|
|
- sizeof(struct wt_status_serialize_data_fixed)];
|
|
|
|
};
|
|
|
|
|
2018-07-25 21:49:37 +03:00
|
|
|
enum wt_status_deserialize_wait
|
|
|
|
{
|
|
|
|
DESERIALIZE_WAIT__UNSET = -3,
|
|
|
|
DESERIALIZE_WAIT__FAIL = -2, /* return error, do not fallback */
|
|
|
|
DESERIALIZE_WAIT__BLOCK = -1, /* unlimited timeout */
|
|
|
|
DESERIALIZE_WAIT__NO = 0, /* immediately fallback */
|
|
|
|
/* any positive value is a timeout in tenths of a second */
|
|
|
|
};
|
|
|
|
|
2017-08-22 18:54:23 +03:00
|
|
|
/*
|
|
|
|
* Serialize computed status scan results using "version 1" format
|
|
|
|
* to the given file.
|
|
|
|
*/
|
2018-02-02 22:17:05 +03:00
|
|
|
void wt_status_serialize_v1(int fd, struct wt_status *s);
|
2017-08-22 18:54:23 +03:00
|
|
|
|
|
|
|
/*
|
|
|
|
* Deserialize existing status results from the given file and
|
|
|
|
* populate a (new) "struct wt_status". Use the contents of "cmd_s"
|
|
|
|
* (computed from the command line arguments) to verify that the
|
|
|
|
* cached data is compatible and overlay various display-related
|
|
|
|
* fields.
|
|
|
|
*/
|
|
|
|
int wt_status_deserialize(const struct wt_status *cmd_s,
|
2018-07-25 21:49:37 +03:00
|
|
|
const char *path,
|
|
|
|
enum wt_status_deserialize_wait dw);
|
2017-08-22 18:54:23 +03:00
|
|
|
|
gvfs:trace2:data: status deserialization information
Add trace2 region and data events describing attempts to deserialize
status data using a status cache.
A category:status, label:deserialize region is pushed around the
deserialize code.
Deserialization results when reading from a file are:
category:status, path = <path>
category:status, polled = <number_of_attempts>
category:status, result = "ok" | "reject"
When reading from STDIN are:
category:status, path = "STDIN"
category:status, result = "ok" | "reject"
Status will fallback and run a normal status scan when a "reject"
is reported (unless "--deserialize-wait=fail").
If "ok" is reported, status was able to use the status cache and
avoid scanning the workdir.
Additionally, a cmd_mode is emitted for each step: collection,
deserialization, and serialization. For example, if deserialization
is attempted and fails and status falls back to actually computing
the status, a cmd_mode message containing "deserialize" is issued
and then a cmd_mode for "collect" is issued.
Also, if deserialization fails, a data message containing the
rejection reason is emitted.
Signed-off-by: Jeff Hostetler <jeffhost@microsoft.com>
2018-09-26 18:21:22 +03:00
|
|
|
int wt_status_deserialize_access(const char *path, int mode);
|
|
|
|
|
2018-07-20 19:08:50 +03:00
|
|
|
/*
|
|
|
|
* A helper routine for serialize and deserialize to compute
|
|
|
|
* metadata for the user-global and repo-local excludes files.
|
|
|
|
*/
|
|
|
|
void wt_serialize_compute_exclude_header(struct strbuf *sb,
|
|
|
|
const char *key,
|
|
|
|
const char *path);
|
|
|
|
|
2006-09-08 12:05:34 +04:00
|
|
|
#endif /* STATUS_H */
|