Macros for SAS Application Developers
https://github.com/sasjs/core
Loading...
Searching...
No Matches
mp_gitstatus.sas
Go to the documentation of this file.
1/**
2 @file
3 @brief Creates a dataset with the output from `GIT_STATUS()`
4 @details Uses `git_status()` to fetch the number of changed files, then
5 iterates with `git_status_get()`, inserting all attributes into an output
6 dataset.
7
8 Usage:
9
10 %let dir=%sysfunc(pathname(work))/core;
11 %let repo=https://github.com/sasjs/core;
12 %put source clone rc=%sysfunc(GITFN_CLONE(&repo,&dir));
13 %mf_writefile(&dir/somefile.txt,l1=some content)
14 %mf_deletefile(&dir/package.json)
15
16 %mp_gitstatus(&dir,outds=work.gitstatus)
17
18 More info on these functions is in this [helpful paper]
19(https://www.sas.com/content/dam/SAS/support/en/sas-global-forum-proceedings/2019/3057-2019.pdf)
20 by Danny Zimmerman.
21
22 @param [in] gitdir The directory containing the GIT repository
23 @param [out] outds= (work.git_status) The output dataset to create. Vars:
24 @li gitdir $1024 - directory of repo
25 @li path $1024 - relative path to the file in the repo
26 @li staged $32 - whether the file is staged (TRUE or FALSE)
27 @li status $64 - either new, deleted, or modified
28 @li cnt - number of files
29 @li n - the "nth" file in the list from git_status()
30
31 @param [in] mdebug= (0) Set to 1 to enable DEBUG messages
32
33 <h4> Related Files </h4>
34 @li mp_gitstatus.test.sas
35 @li mp_gitadd.sas
36
37 @sasjslint {"maxLineLength": 96}
38**/
39
40%macro mp_gitstatus(gitdir,outds=work.mp_gitstatus,mdebug=0);
41
42data &outds;
43 LENGTH gitdir path $ 1024 STATUS $ 64 STAGED $ 32;
44 call missing (of _all_);
45 gitdir=symget('gitdir');
46 cnt=git_status(trim(gitdir));
47 if cnt=-1 then do;
48 put "The libgit2 library is unavailable and no Git operations can be used.";
49 put "See: https://stackoverflow.com/questions/74082874";
50 end;
51 else if cnt=-2 then do;
52 put "The libgit2 library is available, but the status function failed.";
53 put "See the log for details.";
54 end;
55 else do n=1 to cnt;
56 rc=GIT_STATUS_GET(n,gitdir,'PATH',path);
57 rc=GIT_STATUS_GET(n,gitdir,'STAGED',staged);
58 rc=GIT_STATUS_GET(n,gitdir,'STATUS',status);
59 output;
60 %if &mdebug=1 %then %do;
61 putlog (_all_)(=);
62 %end;
63 end;
64 rc=git_status_free(trim(gitdir));
65 drop rc cnt;
66run;
67
68%mend mp_gitstatus;