java - Add a file inside a folder to Github using JGit or EGit - directory1\myfile.txt -


*added final working program bottom of question *

i able add file github using org.eclipse.egit.github.core java library (and code sample referred here: https://gist.github.com/detelca/2337731 )

but not able give path "folder1\myfile.txt" or "folder1\folder2\myfile.txt"

i trying find simple example add file under folder , not able find it.

any on example?

below code using: (configuration details username, reponame in method addfiletogh() )

import java.io.ioexception; import java.util.arraylist; import java.util.calendar; import java.util.collection; import java.util.date; import java.util.list;  import org.eclipse.egit.github.core.blob; import org.eclipse.egit.github.core.commit; import org.eclipse.egit.github.core.commituser; import org.eclipse.egit.github.core.reference; import org.eclipse.egit.github.core.repository; import org.eclipse.egit.github.core.repositorycommit; import org.eclipse.egit.github.core.tree; import org.eclipse.egit.github.core.treeentry; import org.eclipse.egit.github.core.typedresource; import org.eclipse.egit.github.core.user; import org.eclipse.egit.github.core.client.githubclient; import org.eclipse.egit.github.core.service.commitservice; import org.eclipse.egit.github.core.service.dataservice; import org.eclipse.egit.github.core.service.repositoryservice; import org.eclipse.egit.github.core.service.userservice;  public class ghfilewriter {      public static void main(string[] args) {         try {             new ghfilewriter().addfiletogh("myfile.txt", "some file content");             //new ghfilewriter().addfoldertogh("folder1");         } catch (ioexception e) {             // todo auto-generated catch block             e.printstacktrace();         }     }       public boolean addfiletogh(string filename, string filecontent) throws ioexception{         string username = "myusername";         string password = "mypassword";         string reponame = "myrepository";          string ownername = "myusername";         string email = "myemail@gmail.com";          //basic authentication         githubclient client = new githubclient();             client.setcredentials(username, password);          // create needed services         repositoryservice repositoryservice = new repositoryservice();         commitservice commitservice = new commitservice(client);         dataservice dataservice = new dataservice(client);       // sha's current state in git         repository repository =  repositoryservice.getrepository(ownername, reponame );         string basecommitsha = repositoryservice.getbranches(repository).get(0).getcommit().getsha();         repositorycommit basecommit = commitservice.getcommit(repository, basecommitsha);         string treesha = basecommit.getsha();          // create new blob data         blob blob = new blob();             blob.setcontent( filecontent ).setencoding(blob.encoding_utf8); //"[\"" + system.currenttimemillis() + "\"]").setencoding(blob.encoding_utf8);         string blob_sha = dataservice.createblob(repository, blob);         tree basetree = dataservice.gettree(repository, treesha); collection<treeentry> entries = new arraylist<treeentry>();      // create new tree entry     treeentry treeentry = new treeentry();         treeentry.setpath( filename );         treeentry.setmode(treeentry.mode_blob);         treeentry.settype(treeentry.type_blob);         treeentry.setsha(blob_sha);         treeentry.setsize(blob.getcontent().length());     /* //code adding folder, not working treeentry folderentry = new treeentry();         folderentry.setpath( "folder1" );         folderentry.setmode(treeentry.mode_directory);         folderentry.settype(treeentry.type_tree);         folderentry.setsha(blob_sha); //one of possible issues         //folderentry.setsize(blob.getcontent().length());          entries.add(folderentry);  */               entries.add(treeentry);          tree newtree = dataservice.createtree(repository, entries, basetree.getsha()); //issue popped-up here, error thrown here       // create commit         commit commit = new commit();             commit.setmessage("test commit @ " + new date(system.currenttimemillis()).tolocalestring());             commit.settree(newtree);                //due error github api have to             //todo: make better (another function)             userservice userservice = new userservice(client);             user user = userservice.getuser();              commituser author = new commituser();             calendar = calendar.getinstance();                  author.setname( username );                 author.setemail(email);             //author.setemail(userservice.getemails().get(0));                 author.setdate(now.gettime());                 commit.setauthor(author);                 commit.setcommitter(author);           list<commit> listofcommits = new arraylist<commit>();             listofcommits.add(new commit().setsha(basecommitsha));         // listofcommits.containsall(base_commit.getparents());             commit.setparents(listofcommits);         // commit.setsha(base_commit.getsha());         commit newcommit = dataservice.createcommit(repository, commit);       // create resource         typedresource commitresource = new typedresource();         commitresource.setsha(newcommit.getsha());         commitresource.settype(typedresource.type_commit);         commitresource.seturl(newcommit.geturl());          //system.out.println("committed file url: "+ newcommit.geturl());      // master reference , update         reference reference = dataservice.getreference(repository, "heads/master");             reference.setobject(commitresource);             dataservice.editreference(repository, reference, true);              if( newcommit.geturl() != null || !newcommit.geturl().equalsignorecase("") ){                 return true;             }         //push.setcommits(commits);          return false;     } } 

below error when execute above code.

org.eclipse.egit.github.core.client.requestexception: tree.sha a3b93733a6dfd221c24e94d2ce52c25307910d73 not valid tree (422) @ org.eclipse.egit.github.core.client.githubclient.createexception(githubclient.java:552) @ org.eclipse.egit.github.core.client.githubclient.sendjson(githubclient.java:643) @ org.eclipse.egit.github.core.client.githubclient.post(githubclient.java:757) @ org.eclipse.egit.github.core.service.dataservice.createtree(dataservice.java:203) @ com.apps.ui5.accelerator.writers.ghfilewriter.addfiletogh(ghfilewriter.java:87) @ com.apps.ui5.accelerator.writers.ghfilewriter.main(ghfilewriter.java:30)

edit: error causing code commented. commented code starts "//code adding folder, not working"

possible issue line of code: folderentry.setsha(blob_sha);

the error thrown @ line: tree newtree = dataservice.createtree(repository, entries, basetree.getsha());


edit(vonc response): hi vonc, lot response. jgit looks promising see below issues.

  1. i running service in cloud instance dont know if can rely on filerepo refererred in cookbook example. if works in cloud, can consider solution.
  2. the example adding simple file not folder/directory.
  3. and need push changes github using java program, not git commands. how can that?

can refer example creating folder? tried below code adding folder did not work!

import java.io.file; import java.io.ioexception; import java.io.printwriter;  import org.dstadler.jgit.helper.cookbookhelper; import org.eclipse.jgit.api.git; import org.eclipse.jgit.api.errors.gitapiexception; import org.eclipse.jgit.api.errors.nofilepatternexception; import org.eclipse.jgit.lib.repository;   public class ghfolderwriter {      public static void main(string[] args) throws ioexception, nofilepatternexception, gitapiexception {         // prepare new test-repository         try (repository repository = cookbookhelper.createnewrepository()) {             try (git git = new git(repository)) {                 //create folder                 file folder = new file(repository.getdirectory().getparent(), "folder1");                 if(!folder.createnewfile()) {                     throw new ioexception("could not create folder " + folder);                 }                  // create file                 file myfile = new file(folder, "testfile1.txt");                 if(!myfile.createnewfile()) {                     throw new ioexception("could not create file " + myfile);                 }                  // stage files in repo including new files                 git.add().addfilepattern(".").call();                  // , commit changes.                 git.commit()                         .setmessage("commit changes including additions")                         .call();                  try(printwriter writer = new printwriter(myfile)) {                     writer.append("hello, world!");                 }                  // stage changed files, omitting new files, , commit 1 command                 git.commit()                         .setall(true)                         .setmessage("commit changes files")                         .call();                   system.out.println("committed changes repository @ " + repository.getdirectory());             }         }      }  } 

it throwing error:

exception in thread "main" java.io.ioexception: not open file. reason : system cannot find path specified (path c:\users\ramgood\appdata\local\temp\testgitrepository441020326444846897\folder1\testfile1.txt, working dir c:\users\ramgood\workspace-sapui5-1.32\accelerate) @ java.io.winntfilesystem.createfileexclusively(native method) @ java.io.file.createnewfile(file.java:1016) @ com.apps.ui5.accelerator.writers.ghfolderwriter.main(ghfolderwriter.java:37)

edit(3): moved jgit suggested , below new program. able 1. clone remote repo local repo 2. add folder , file local repo , commit locally 3. failing push github.

import java.io.file; import java.io.ioexception; import java.io.printwriter;  import org.eclipse.jgit.api.git; import org.eclipse.jgit.api.errors.gitapiexception; import org.eclipse.jgit.lib.repository; import org.eclipse.jgit.storage.file.filerepositorybuilder; import org.eclipse.jgit.transport.usernamepasswordcredentialsprovider;    /**  * note: snippet not done , not show useful yet  *  * @author dominik.stadler @ gmx.at  */ public class pushtoremoterepository {      private static final string remote_url = "https://github.com/debsap/testrepo.git";      public static void main(string[] args) throws ioexception, gitapiexception {         // prepare new folder cloned repository         file localpath = file.createtempfile("restgitrepository", "");         if(!localpath.delete()) {             throw new ioexception("could not delete temporary file " + localpath);         }          // clone         system.out.println("cloning " + remote_url + " " + localpath);         try (git git = git.clonerepository()                 .seturi(remote_url)                 .setcredentialsprovider(new usernamepasswordcredentialsprovider("debsap", "testpasword1"))                 .setdirectory(localpath)                 .call()) {              repository repository = git.getrepository();             // create folder             file thedir = new file(repository.getdirectory().getparent(), "dir1");             thedir.mkdir();           // create file             file myfile = new file(thedir, "testfile2.txt");             if(!myfile.createnewfile()) {                 throw new ioexception("could not create file " + myfile);             }              // stage files in repo including new files             git.add().addfilepattern(".").call();              // , commit changes.             git.commit().setmessage("commit changes including additions").call();              try(printwriter writer = new printwriter(myfile)) {                 writer.append("hello, world!");             }             // stage changed files, omitting new files, , commit 1 command             git.commit()                     .setall(true)                     .setmessage("commit changes files")                     .call();          // open created repository             filerepositorybuilder builder = new filerepositorybuilder();             try (repository repository1 = builder.setgitdir(localpath)                     .readenvironment() // scan environment git_* variables                     .findgitdir() // scan file system tree                     .build()) {                  try (git git1 = new git(repository1)) {                     git1.push().call();                 }                 system.out.println("pushed repository: " + repository1.getdirectory() + " remote repository @ " + remote_url);             }         }     } } 

i getting below error while trying push remote repo or github.

cloning https://github.com/debsap/testrepo.git c:\users\ramgood\appdata\local\temp\restgitrepository8321744366017013430 exception in thread "main" org.eclipse.jgit.api.errors.transportexception: origin: not found. @ org.eclipse.jgit.api.pushcommand.call(pushcommand.java:183) @ org.dstadler.jgit.unfinished.pushtoremoterepository.main(pushtoremoterepository.java:88) caused by: org.eclipse.jgit.errors.noremoterepositoryexception: origin: not found. @ org.eclipse.jgit.transport.transportlocal$1.open(transportlocal.java:131) @ org.eclipse.jgit.transport.transportbundlefile$1.open(transportbundlefile.java:106) @ org.eclipse.jgit.transport.transport.open(transport.java:565) @ org.eclipse.jgit.transport.transport.openall(transport.java:383) @ org.eclipse.jgit.api.pushcommand.call(pushcommand.java:147) ... 1 more

below config file .git folder. note cannot edit manually , should updated through java program only.

[core] symlinks = false repositoryformatversion = 0 filemode = false logallrefupdates = true [remote "origin"] url = https://github.com/debsap/testrepo.git fetch = +refs/heads/:refs/remotes/origin/ [branch "master"] remote = origin merge = refs/heads/master

edit(solution): below working program.

public void pushtoremote(string xmlviewcontent) throws ioexception, invalidremoteexception, transportexception, gitapiexception{         // prepare new folder cloned repository         file localpath = file.createtempfile("gitrepository", "");         if(!localpath.delete()) {             throw new ioexception("could not delete temporary file " + localpath);         }          // clone         system.out.println("cloning " + remote_url + " " + localpath);         try (git git = git.clonerepository()                 .seturi(remote_url)                 .setcredentialsprovider(new usernamepasswordcredentialsprovider(username, password))                 .setdirectory(localpath)                 .call()) {              repository repository = git.getrepository();             // create folder             file thedir = new file(repository.getdirectory().getparent(), "webapp");                 thedir.mkdir();           // create file             file myfile = new file(thedir, "inputview.view.xml");                 myfile.createnewfile();              // stage files in repo including new files             git.add().addfilepattern(".").call();              // , commit changes.             git.commit().setmessage("commit changes including additions").call();              try(printwriter writer = new printwriter(myfile)) {                 writer.append( xmlviewcontent );             }             // stage changed files, omitting new files, , commit 1 command             git.commit()                     .setall(true)                     .setmessage("commit changes files")                     .call();             git.add().addfilepattern("*").call();             revcommit result = git.commit().setmessage("initial commit").call();             git.push()                 .setcredentialsprovider(new usernamepasswordcredentialsprovider(username, password))                 .call();             system.out.println("pushed commit: "+ result);          }     } 

thanks vonc responses.

for manipulating files in git repo, might better off using jgit directly, not egit-github (though based on jgit).

that way, can benefit examples in centic9/jgit-cookbook, including jgit/porcelain/commitall.java example using addfilepattern:

// stage files in repo including new files git.add().addfilepattern(".").call(); 

that way, can add folder (content) need.

i running service in cloud instance dont know if can rely on filerepo refererred in cookbook example. if works in cloud, can consider solution.

you rely on same file repo using right now.

the example adding simple file not folder/directory.

simply replace file folder: work , add folder content.

and need push changes github using java program, not git commands. how can that?

simply adding remote github repo, and pushing.
both available in jgit (so in java).


Comments

Popular posts from this blog

c# - Binding a comma separated list to a List<int> in asp.net web api -

Delphi 7 and decode UTF-8 base64 -

html - Is there any way to exclude a single element from the style? (Bootstrap) -