Skip to content

Commit

Permalink
feat: support star new repo (#50)
Browse files Browse the repository at this point in the history
* feat: support star new repo

* fix compile

* add omg_repo_star interactive method
  • Loading branch information
jiacai2050 authored Nov 27, 2022
1 parent eec61e4 commit 6507dcd
Show file tree
Hide file tree
Showing 6 changed files with 74 additions and 23 deletions.
16 changes: 1 addition & 15 deletions README.org
Original file line number Diff line number Diff line change
Expand Up @@ -84,21 +84,7 @@ The figure below shows relations among those mode:
- =omg-gist-list-starred=
- =omg-trending-list=
- =omg-whoami=
- =omg-pull-create=, create a PR based on current project, it will open a org buffer, which contains following metadata to describe which repo/branch you want to merge into
#+begin_example
#+TITLE: refactor: rename all prefix to omg (#47)
#+TARGET-REPO: jiacai2050/oh-my-github
#+TARGET-BRANCH: master
#+SOURCE-HEAD: jiacai2050:refactor
#+DRAFT: false
#+end_example
Users can configure those metadata with this(in =.dir-locals.el=)
#+BEGIN_SRC emacs-lisp
((prog-mode . ((omg-pull-target-repo . "jiacai2050/oh-my-github")
(omg-pull-target-branch . "master")
(omg-pull-username . "jiacai2050")
(omg-pull-draft . "false"))))
#+END_SRC
- =omg-pull-create=, See [[https://en.liujiacai.net/2022/11/26/oh-my-github-1-0/][this blog post]] to check how to utilize it

** Screenshots
*** Starred repositories
Expand Down
36 changes: 36 additions & 0 deletions core/omg.c
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ const char *GET_METHOD = "GET";
const char *DELETE_METHOD = "DELETE";
const char *POST_METHOD = "POST";
const char *PATCH_METHOD = "PATCH";
const char *PUT_METHOD = "PUT";
// when in test, fetch less data
#ifdef OMG_TEST
const size_t PER_PAGE = 10;
Expand Down Expand Up @@ -855,6 +856,41 @@ omg_error omg_unstar_repo(omg_context ctx, size_t repo_id) {
return omg_request(ctx, DELETE_METHOD, url, NULL, NULL);
}

static const char *iso8601_now() {
char *buf = malloc(32);
time_t timer;
struct tm *tm_info;

timer = time(NULL);
tm_info = gmtime(&timer);
// 2022-11-23T23:38:54Z
strftime(buf, 36, "%Y-%m-%dT%H:%M:%SZ", tm_info);
return buf;
}

omg_error omg_star_repo(omg_context ctx, const char *repo_full_name) {
char url[128];
sprintf(url, "%s/user/starred/%s", API_ROOT, repo_full_name);
omg_error err = omg_request(ctx, PUT_METHOD, url, NULL, NULL);
if (!is_ok(err)) {
return err;
}

memset(url, 0, sizeof(url));
sprintf(url, "%s/repos/%s", API_ROOT, repo_full_name);
json_auto_t *repo_resp = NULL;
err = omg_request(ctx, GET_METHOD, url, NULL, &repo_resp);
if (!is_ok(err)) {
return err;
}

omg_auto_repo repo = repo_from_json(repo_resp);
omg_auto_char now = (char *)iso8601_now();
omg_starred_repo starred_repo = {.starred_at = now, .repo = repo};
omg_starred_repo_list star_lst = {.star_array = &starred_repo, .length = 1};
return save_starred_repos(ctx, star_lst);
}

void omg_free_user(omg_user *user) {
if (user) {
#ifdef VERBOSE
Expand Down
2 changes: 2 additions & 0 deletions core/omg.h
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,7 @@ omg_error omg_query_created_repos(omg_context ctx, const char *keyword,

// Starred repos
typedef struct {
/* "2022-11-23T23:38:54Z" */
char *starred_at;
omg_repo repo;
} omg_starred_repo;
Expand All @@ -89,6 +90,7 @@ omg_error omg_query_starred_repos(omg_context ctx, const char *keyword,
const char *language,
omg_starred_repo_list *out);
omg_error omg_unstar_repo(omg_context ctx, size_t repo_id);
omg_error omg_star_repo(omg_context ctx, const char *repo_full_name);

// Users
typedef struct omg_user {
Expand Down
17 changes: 17 additions & 0 deletions emacs/emacs.c
Original file line number Diff line number Diff line change
Expand Up @@ -310,6 +310,20 @@ emacs_value omg_dyn_unstar_repo(emacs_env *env, ptrdiff_t nargs,
return Qt;
}

emacs_value omg_dyn_star_repo(emacs_env *env, ptrdiff_t nargs,
emacs_value *args, void *data) {
ENSURE_SETUP(env);
omg_auto_char repo_full_name = get_string(env, args[0]);
ENSURE_NONLOCAL_EXIT(env);

omg_error err = omg_star_repo(ctx, repo_full_name);
if (!is_ok(err)) {
return lisp_funcall(env, "error", lisp_string(env, (char *)err.message));
}

return Qt;
}

emacs_value omg_dyn_delete_gist(emacs_env *env, ptrdiff_t nargs,
emacs_value *args, void *data) {
ENSURE_SETUP(env);
Expand Down Expand Up @@ -771,6 +785,9 @@ int emacs_module_init(runtime ert) {
lisp_funcall(env, "fset", lisp_symbol(env, "omg-dyn-unstar-repo"),
env->make_function(env, 1, 1, omg_dyn_unstar_repo,
"Unstar repository", NULL));
lisp_funcall(env, "fset", lisp_symbol(env, "omg-dyn-star-repo"),
env->make_function(env, 1, 1, omg_dyn_star_repo,
"Star repository", NULL));

lisp_funcall(
env, "fset", lisp_symbol(env, "omg-dyn-delete-gist"),
Expand Down
21 changes: 13 additions & 8 deletions emacs/omg-repo.el
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,12 @@
(tabulated-list-print t)
(switch-to-buffer (current-buffer))))

(defun omg-repo-star (full-name)
"Star repository at point."
(interactive (list (omg-repo--get-full-name)))
(omg-dyn-star-repo full-name)
(message "Starred %s" full-name))

(defun omg-repo--revert (&optional revert)
(setq omg-repo--query-keyword "")
(setq omg-repo--query-language ""))
Expand All @@ -102,6 +108,7 @@
(define-key map (kbd "b") 'omg-repo-browse)
(define-key map (kbd "w") 'omg-repo-copy-url)
(define-key map (kbd "s") 'omg-repo-query-repos)
(define-key map (kbd "S") 'omg-repo-star)
(define-key map (kbd "r") 'omg-repo-query-releases)
(define-key map (kbd "RET") 'omg-repo-query-commits)
(define-key map (kbd "s-u") 'tabulated-list-revert)
Expand All @@ -111,15 +118,13 @@
(define-derived-mode omg-repo-mode tabulated-list-mode "omg-repo created repos" "Manage created repositories"
(omg-repo--init-repos-tabulated-list 'omg-repo--query-created))

(defun omg-repo-unstar ()
(defun omg-repo-unstar (full-name)
"Unstar repository at point."
(interactive)
(if-let ((full-name (omg-repo--get-full-name)))
(when (yes-or-no-p (format "Are you really want to unstar %s?" full-name))
(omg-dyn-unstar-repo (string-to-number (tabulated-list-get-id)))
(tabulated-list-delete-entry)
(message "Unstarred %s" full-name))
(user-error "There is no repository at point")))
(interactive (list (omg-repo--get-full-name)))
(when (yes-or-no-p (format "Are you really want to unstar %s?" full-name))
(omg-dyn-unstar-repo (string-to-number (tabulated-list-get-id)))
(tabulated-list-delete-entry)
(message "Unstarred %s" full-name)))

(defvar omg-repo-starred-mode-map
(let ((map (make-sparse-keymap)))
Expand Down
5 changes: 5 additions & 0 deletions tests/main.zig
Original file line number Diff line number Diff line change
Expand Up @@ -116,6 +116,10 @@ fn test_create_pull(ctx: ?*clib.struct_omg_context) anyerror!void {
try testing.expectEqual(@as(i32, 330), resp.deletions);
}

fn test_star_repo(ctx: ?*clib.struct_omg_context) anyerror!void {
try check_error(clib.omg_star_repo(ctx, "jiacai2050/oh-my-github"));
}

pub fn main() anyerror!void {
log.info(
\\
Expand All @@ -142,4 +146,5 @@ pub fn main() anyerror!void {
try test_created_repos(ctx);
try test_created_gists(ctx);
try test_create_pull(ctx);
try test_star_repo(ctx);
}

0 comments on commit 6507dcd

Please sign in to comment.