简体   繁体   中英

Downloading GitHub issues to .csv file

GitHub issues download using eclipse egit doesn't return anything.

Recently, i've been attempting to create a java desktop application (for windows), that will download GitHub issues from a specific GitHub issue repository, and save them in a .csv file.

I've created a simple GUI using Swing to enable the input of repository names. I'm also using eclipse's egit library to establish a connection to GitHub in order to download issues. I use authentication, entered using a .properties file in order to authenticate egit's connection with GitHub.

Here is the main code my application uses to download the issues and write them to a .csv file:

package io.github.psgs.issuesdownload;

import io.github.psgs.issuesdownload.gui.GUI;
import org.eclipse.egit.github.core.Issue;
import org.eclipse.egit.github.core.client.GitHubClient;
import org.eclipse.egit.github.core.service.IssueService;

import java.io.FileWriter;
import java.io.IOException;

public class IssuesDownload {

    public static void main(String[] args) {
        try {
        Config.loadConfiguration();
        } catch(IOException ex) {

        }
        GUI.main(args);
    }

    public static String saveIssues(String repoDetails) {
        String[] repoInfo = repoDetails.split("/");
        String repoOwner = repoInfo[0];
        String repoName = repoInfo[1];

        GitHubClient client = new GitHubClient();
        client.setCredentials(Config.githubuser, Config.githubpass);

        IssueService issueService = new IssueService(client);

        try {
            FileWriter writer = new FileWriter("issues.csv");
            //String[] header = {"Id", "Title", "Creator", "Assignee", "Milestone", "State", "Body Text"};
            writer.append("Id, Title, Creator, Assignee, Milestone, State, Body Text");
            writer.append("\n");

            for (Issue issue : issueService.getIssues(repoOwner, repoName, null)) {
                //String[] data = {String.valueOf(issue.getId()), issue.getTitle(), issue.getUser().getName(), issue.getAssignee().getName(), issue.getMilestone().getTitle(), issue.getState(), issue.getBodyText()};
                writer.append(String.valueOf(issue.getId()) + ",");
                writer.append(issue.getTitle() + ",");
                writer.append(issue.getUser().getName() + ",");
                writer.append(issue.getAssignee().getName() + ",");
                writer.append(issue.getMilestone().getTitle() + ",");
                writer.append(issue.getState() + ",");
                writer.append(issue.getBodyText());
                writer.append("\n");
            }
            writer.flush();
            writer.close();
            return "Download Complete!";
        } catch (IOException ex) {
            System.out.println("An IOException has occured!");
            ex.printStackTrace();
            if (ex.getMessage().equalsIgnoreCase("api.github.com")) {
                return "An error has occured, reaching " + ex.getMessage() + "! Please check your network connection.";
            }
        }
        return "An error has occured!";
    }
}

This code is also available at: https://gist.github.com/psgs/9048602

The whole repository can be found at: https://github.com/psgs/IssuesDownload

When I run this code, with the .properties file in the same directory as the compile .jar file, the GitHub issues don't appear in the .csv file. I've tested the .csv file output, and the headers write correctly when I remove the download code.

Would anybody know why this is happening? Perhaps it's an authentication problem that i've missed?

After trying a few new API wrappers, i've found an API library that works. I'm now using Kohsuke Kawaguchi's GitHub API for Java to connect to GitHub.

<dependency>
        <groupId>org.kohsuke</groupId>
        <artifactId>github-api</artifactId>
        <version>1.49</version>
</dependency>

My code now reads as follows:

package io.github.psgs.issuesdownload;

import io.github.psgs.issuesdownload.gui.GUI;
import org.kohsuke.github.GHIssue;
import org.kohsuke.github.GHIssueState;
import org.kohsuke.github.GHRepository;
import org.kohsuke.github.GitHub;

import java.io.FileWriter;
import java.io.IOException;

public class IssuesDownload {

    public static void main(String[] args) {
        try {
            Config.loadConfiguration();
        } catch (IOException ex) {
            System.out.println("An IOException had occured while loading the configuration!");
            ex.printStackTrace();
        }
        GUI.main(args);
    }

    public static String saveIssues(String repoDetails, GHIssueState issueState) {

        String[] repoInfo = repoDetails.split("/");

        try {
            GitHub github = GitHub.connectUsingOAuth(Config.githubtoken);
            GHRepository repository = github.getUser(repoInfo[0]).getRepository(repoInfo[1]);

            FileWriter writer = new FileWriter("issues.csv");
            writer.append("Id, Title, Creator, Assignee, Milestone, State, Body Text");
            writer.append("\n");

            for (GHIssue issue : repository.getIssues(issueState)) {
                writer.append(String.valueOf(issue.getNumber()) + ",");
                writer.append(issue.getTitle() + ",");
                writer.append(issue.getUser().getLogin() + ",");
                if (issue.getAssignee() != null) {
                    writer.append(issue.getAssignee().getName() + ",");
                } else {
                    writer.append(" ,");
                }
                if (issue.getMilestone() != null) {
                    writer.append(issue.getMilestone().getTitle() + ",");
                } else {
                    writer.append(" ,");
                }
                writer.append(issue.getState() + ",");
                writer.append(issue.getBody() + ",");
                writer.append("\n");
            }
            writer.flush();
            writer.close();
            return "Download Complete!";
        } catch (IOException ex) {
            System.out.println("An IOException has occured!");
            ex.printStackTrace();
            if (ex.getMessage().equalsIgnoreCase("api.github.com")) {
            return "An error has occurred reaching " + ex.getMessage() + "! Please check your network connection.";
            }
        }
        return "An error has occured!";
    }
}

It looks like the method you're using is meant to be used to retrieve the issues for the currently authenticated user .

Perhaps this test (in the project's repository) would be helpful. The only difference I see is that you're not passing a singletonMap and I'm not sure you exactly have to.

public static <T> void outputCsv(String fileName, String[] headerName,
        List<T> listResult, HttpServletRequest request) {
    HttpServletResponse response = ResponseUtil.getResponse();
    OutputStream out;
    try {
        // Encode file name
        fileName = Util.encodeUnicodeFile(fileName, request);

        response.setStatus(HttpServletResponse.SC_OK);
        response.setContentType("application/octet-stream; charset="
                + Constant.CONST_SJIS_ENCODING);
        response.setHeader("Content-disposition", "attachment; filename=\""
                + fileName + "\"");
        response.setCharacterEncoding(Constant.CONST_SJIS_ENCODING);

        out = response.getOutputStream();

        CSVWriter writer = new CSVWriter(new OutputStreamWriter(out,
                Constant.CONST_WINDOW_JAPAN_ENCODING),
                Constant.CONST_CSV_SEPARATOR_COMMA);
        // Convert list result data to List <String[]>
        List<String[]> list = convertListDataToCsvArray(listResult,
                headerName);

        // Write list data
        writer.writeAll(list);
        writer.close();

        out.close();

    } catch (Exception e) {
        e.printStackTrace();
    }
}
private static <T> List<String[]> convertListDataToCsvArray(
        List<T> listResult, String[] headerName) {
    List<String[]> listCsv = new ArrayList<String[]>();
    // First row is header
    listCsv.add(headerName);

    for (T object : listResult) {
        // Get all fields of object
        Field[] fields = object.getClass().getFields();
        // Init row
        String[] row = new String[headerName.length];

        int index = 0;
        for (Field field : fields) {
            try {
                if (field.getType().equals(Long.class)) {
                    // Read field value and set to string array
                    Long value = (Long) field.get(object);
                    row[index] = value != null ? String.valueOf(value) : "";
                } else if (field.getType().equals(String.class)) {
                    // Read field value and set to string array
                    String value = (String) field.get(object);
                    row[index] = value != null ? value : "";
                } else if (field.getType().equals(BigDecimal.class)) {
                    // Read field value and set to string array
                    BigDecimal value = (BigDecimal) field.get(object);
                    row[index] = value != null ? String.valueOf(value) : "";
                }

            } catch (IllegalArgumentException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
            index++;
        }
        // Add row
        listCsv.add(row);
    }

    return listCsv;
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM